#include "cpu/exec/helper.h"

// 处理 `call imm` 指令，调用指定的立即数地址
make_helper(call_si) {
    // 解码立即数，并返回操作数长度
    int len = decode_si_l(eip + 1);
    // 计算返回地址，这里假设 `cpu.eip` 是当前指令的地址
    swaddr_t ret_addr = cpu.eip + len + 1;
    // 将返回地址压入栈中
    swaddr_write(cpu.esp - 4, 4, ret_addr);
    // 更新栈指针
    cpu.esp -= 4;

    // 更新指令指针 `cpu.eip` 到目标地址
    cpu.eip += op_src->val;
    // 打印汇编指令和目标地址
    print_asm("call %x", cpu.eip + 1 + len);

    // 返回指令长度
    return len + 1;
}

// 处理 `call rm` 指令，调用由内存操作数指定的地址
make_helper(call_rm) {
    // 解码内存操作数，并返回操作数长度
    int len = decode_rm_l(eip + 1);
    // 计算返回地址
    swaddr_t ret_addr = cpu.eip + len + 1;
    // 将返回地址压入栈中
    swaddr_write(cpu.esp - 4, 4, ret_addr);
    // 更新栈指针
    cpu.esp -= 4;

    // 更新指令指针 `cpu.eip` 到目标地址（减去指令长度）
    cpu.eip = op_src->val - (len + 1);
    // 打印汇编指令和目标地址
    print_asm("call *%s", op_src->str);

    // 返回指令长度
    return len + 1;
}
